﻿using docTissV2.Enumeradores;
using docTissV2.Classes;
using AcessaDadosBD.Repositorios;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;

namespace docTissV2.Classes.TreeNodeContents
{
    public interface TreeNodeContent
    {
        #region Propriedades
        /// <summary>
        /// Define o tipo do nó
        /// </summary>
        TipoNo TipoNo { get; set; }
        #endregion
    }

    /// <summary>
    /// Conteúdo da tag nó operadora do TreeView Gerenciador de Guias
    /// </summary>
    public class ConteudoNoOperadora : TreeNodeContent
    {
        #region Propriedades
        public TipoNo TipoNo { get; set; }
        /// <summary>
        /// Registro ANS do nó da operadora do TreeView Gerenciador de Guias
        /// </summary>
        public string RegistroANS { get; set; }
        /// <summary>
        /// ID da tabela de juncao Operadora e Prestador
        /// </summary>
        public int IDOperadoraPrestador { get; set; }
        /// <summary>
        /// Identificacao do Prestador Na Operadora
        /// </summary>
        public IdentificacaoPrestadorNaOperadora Identificacao { get; set; }
        /// <summary>
        /// Código do Prestador na Operadora
        /// </summary>
        public string CodigoNaOperadora { get; set; }
        /// <summary>
        /// Logo apresentado na guia
        /// </summary>
        public byte[] Logo { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Conteúdo da tag nó operadora do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="registroANS">Registro ANS da Operadora</param>
        public ConteudoNoOperadora(string registroANS, int idOperadoraPrestador, IdentificacaoPrestadorNaOperadora identificacao, string codigoNaOperadora, byte[] logo)
        {
            this.TipoNo = TipoNo.Operadora;
            this.RegistroANS = registroANS;
            this.IDOperadoraPrestador = idOperadoraPrestador;
            this.Identificacao = identificacao;
            this.CodigoNaOperadora = codigoNaOperadora;
            this.Logo = logo;
        }
        #endregion
    }

    /// <summary>
    /// Conteúdo da tag nó tipo de guia do TreeView Gerenciador de Guias
    /// </summary>
    public class ConteudoNoTipoGuia : TreeNodeContent
    {
        #region Propriedades
        /// <summary>
        /// Tipo do nó do TreeView Gerenciador de Guias
        /// </summary>
        public TipoNo TipoNo { get; set; }
        /// <summary>
        /// Informações do nó operadora do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoOperadora NoOperadora { get; set; }
        /// <summary>
        /// Tipo de guia do nó tipo guia do TreeView Gerenciador de Guias
        /// </summary>
        public TipoGuia TipoGuia { get; set; }
        /// <summary>
        /// Verifica se seu conteúdo foi carregado do BD
        /// </summary>
        public bool IsLoad { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Conteúdo da tag nó tipo de guia do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="operadora">Conteúdo do nó operadora</param>
        /// <param name="tipoGuia"></param>
        public ConteudoNoTipoGuia(ConteudoNoOperadora operadora, TipoGuia tipoGuia)
        {
            this.TipoNo = TipoNo.TipoGuia;
            this.IsLoad = false;
            this.NoOperadora = operadora;
            this.TipoGuia = tipoGuia;
        }
        #endregion
    }

    /// <summary>
    /// Conteúdo da tag nó lote do TreeView Gerenciador de Guias
    /// </summary>
    public class ConteudoNoLote : TreeNodeContent
    {
        #region Propriedades
        /// <summary>
        /// Tipo do nó do TreeView Gerenciador de Guias
        /// </summary>
        public TipoNo TipoNo { get; set; }
        /// <summary>
        /// Informações do nó operadora do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoOperadora NoOperadora { get; set; }
        /// <summary>
        /// Informações do nó tipo guia do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoTipoGuia NoTipoGuia { get; set; }
        /// <summary>
        /// ID do Lote do nó lote do TreeView Gerenciador de Guias
        /// </summary>
        public int LoteID { get; set; }
        /// <summary>
        /// Numero do Lote
        /// </summary>
        public string NumeroLote { get; set; }
        /// <summary>
        /// Verifica se seu conteúdo foi carregado do BD
        /// </summary>
        public bool IsLoad { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Conteúdo da tag nó lote do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="operadora">Conteúdo do nó operadora</param>
        /// <param name="tipoGuia">Conteúdo do nó tipo guia</param>
        /// <param name="loteID">ID do Lote</param>
        public ConteudoNoLote(ConteudoNoOperadora operadora, ConteudoNoTipoGuia tipoGuia, int loteID, string numeroLote)
        {
            this.TipoNo = TipoNo.Lote;
            this.IsLoad = false;
            this.NoOperadora = operadora;
            this.NoTipoGuia = tipoGuia;
            this.LoteID = loteID;
            this.NumeroLote = numeroLote;
        }
        #endregion
    }

    /// <summary>
    /// Conteúdo da tag nó guia de faturamento e glosa do TreeView Gerenciador de Guias
    /// </summary>
    public class ConteudoNoGuia : TreeNodeContent
    {
        #region Propriedades
        /// <summary>
        /// Tipo do nó do TreeView Gerenciador de Guias
        /// </summary>
        public TipoNo TipoNo { get; set; }
        /// <summary>
        /// Informações do nó operadora do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoOperadora NoOperadora { get; set; }
        /// <summary>
        /// Informações do nó tipo guia do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoTipoGuia NoTipoGuia { get; set; }
        /// <summary>
        /// Informações do nó lote do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoLote NoLote { get; set; }
        /// <summary>
        /// Número da Guia do nó guia TreeView Gerenciador de Guias
        /// </summary>
        public string NumeroGuia { get; set; }
        /// <summary>
        /// Path da Guia do nó guia do TreeView Gerenciador de Guias
        /// </summary>
        public string Path { get; set; }
        /// <summary>
        /// Data de emissão do nó guia do TreeView Gerenciador de Guias
        /// </summary>
        public string DataEmissao { get; set; }
        /// <summary>
        /// Verifica se seu conteúdo foi carregado do BD
        /// </summary>
        public bool IsLoad { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Conteúdo da tag nó guia de Faturamento ou glosa do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="operadora">Conteúdo do nó operadora</param>
        /// <param name="tipoGuia">Conteúdo do nó tipo guia</param>
        /// <param name="lote">Conteúdo do nó lote</param>
        /// <param name="numeroGuia">Número da Guia</param>
        /// <param name="path">Caminho do diretório da Guia</param>
        /// <param name="dataEmissao">Data de Emissão da Guia</param>
        public ConteudoNoGuia(ConteudoNoOperadora operadora, ConteudoNoTipoGuia tipoGuia,
            ConteudoNoLote lote, string numeroGuia, string path, string dataEmissao)
        {
            this.TipoNo = TipoNo.GuiaFaturamento;
            this.IsLoad = false;
            this.NoOperadora = operadora;
            this.NoTipoGuia = tipoGuia;
            this.NoLote = lote;
            this.NumeroGuia = numeroGuia;
            this.Path = path;
            this.DataEmissao = dataEmissao;
        }

        /// <summary>
        /// Conteúdo da tag nó guia Solicitação do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="operadora">Conteúdo do nó operadora</param>
        /// <param name="tipoGuia">Conteúdo do nó tipo guia</param>
        /// <param name="numeroGuia">Número da Guia</param>
        /// <param name="path">Caminho do diretório da Guia</param>
        /// <param name="dataEmissao">Data de Emissão da Guia</param>
        public ConteudoNoGuia(ConteudoNoOperadora operadora, ConteudoNoTipoGuia tipoGuia, string numeroGuia, 
            string path, string dataEmissao)
        {
            this.TipoNo = TipoNo.GuiaSolicitacao;
            this.IsLoad = false;
            this.NoOperadora = operadora;
            this.NoTipoGuia = tipoGuia;
            this.NumeroGuia = numeroGuia;
            this.Path = path;
            this.DataEmissao = dataEmissao;
        }
        #endregion
    }

    /// <summary>
    /// Conteúdo da tag nó guia extensão do TreeView Gerenciador de Guias
    /// </summary>
    public class ConteudoNoGuiaExtensao : TreeNodeContent
    {
        #region Propriedades
        /// <summary>
        /// Tipo do nó do TreeView Gerenciador de Guias
        /// </summary>
        public TipoNo TipoNo { get; set; }
        /// <summary>
        /// Informações do nó operadora do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoOperadora NoOperadora { get; set; }
        /// <summary>
        /// Informações do nó tipo guia do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoTipoGuia NoTipoGuia { get; set; }
        /// <summary>
        /// Informações do nó lote do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoLote NoLote { get; set; }
        /// <summary>
        /// Informações do nó guia do TreeView Gerenciador de Guias
        /// </summary>
        public ConteudoNoGuia NoGuia { get; set; }
        /// <summary>
        /// ID do nó guia extensão do TreeView Gerenciador de Guias
        /// </summary>
        public long GuiaExtensaoID { get; set; }
        /// <summary>
        /// Path da Guia do nó guia do TreeView Gerenciador de Guias
        /// </summary>
        public string Path { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Conteúdo da tag nó guia extensão do TreeView Gerenciador de Guias
        /// </summary>
        /// <param name="operadora">Conteúdo do nó operadora</param>
        /// <param name="tipoGuia">Conteúdo do nó tipo guia</param>
        /// <param name="lote">Conteúdo do nó Lote</param>
        /// <param name="guia">Conteúdo do nó Guia</param>
        /// <param name="guiaID">ID da guia de extensão</param>
        public ConteudoNoGuiaExtensao(ConteudoNoOperadora operadora, ConteudoNoTipoGuia tipoGuia,
            ConteudoNoLote lote, ConteudoNoGuia guia, long guiaID, string pathExtensao)
        {
            this.TipoNo = TipoNo.GuiaFaturamento;
            this.NoOperadora = operadora;
            this.NoTipoGuia = tipoGuia;
            this.NoLote = lote;
            this.NoGuia = guia;
            this.GuiaExtensaoID = guiaID;
            this.Path = pathExtensao;
        }
        #endregion
    }
}
